package main

import "fmt"

// 方法的接收者
/*
Go语言中的方法（Method）是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者（Receiver）。接收者的概念就类似于其他语言中的this或者 self

什么时候应该使用指针类型接收者
需要修改接收者中的值
接收者是拷贝代价比较大的大对象
保证一致性，如果有某个方法使用了指针接收者，那么其他的方法也应该使用指针接收者。
*/

// Person 定义一个结构体
type Person struct {
	name string
	age  int
}

// 实例化person
func newPerson(name string, age int) *Person {
	return &Person{
		name: name,
		age:  age,
	}
}

// 定义一个method Dream

func (p Person) Dream() {
	fmt.Printf("%s 的梦想是学好 go。\n", p.name)
}

// 定义一个指针类型的接收者，可以修改原始的值

func (p *Person) SetAge(newAge int) {
	p.age = newAge
}

// SetAge2 定义一个值接收者，只能修改他自己，不能修改原始值
func (p Person) SetAge2(newAge int) {
	p.age = newAge
}

func main() {
	p1 := newPerson("zcm", 18)
	p1.Dream()
	// 修改之前
	fmt.Println("修改之前的年龄:", p1.age)
	// 修改之后
	//p1.SetAge(25)
	//fmt.Println("修改之后的年龄:", p1.age)
	// 对比python 字典 ，创建一个新字典 = 旧字典，然后修改新字典的值   深浅拷贝
	p1.SetAge2(100)
	fmt.Println("再次修改年龄展示:", p1.age)
}
